package com.ego.passport.service.impl;

import com.ego.commons.pojo.CartPojo;
import com.ego.commons.pojo.EgoResult;
import com.ego.commons.utils.CookieUtils;
import com.ego.commons.utils.IDUtils;
import com.ego.commons.utils.JsonUtils;
import com.ego.commons.utils.ServletUtil;
import com.ego.dubbo.service.TbUserDubboService;
import com.ego.passport.service.PassportService;
import com.ego.pojo.TbUser;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class PassportServiceImpl implements PassportService {
    @Reference
    private TbUserDubboService tbUserDubboService;
    // tempcart
    @Value("${ego.cart.tempcart}")
    private String tempCartCookeName;
    // cart:
    @Value("${ego.cart.rediskey}")
    private String cartRedisKey;
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Override
    public EgoResult check(TbUser tbUser) {
        TbUser user = tbUserDubboService.selectByUser(tbUser);
        if(user==null){
            return EgoResult.ok();
        }
        return EgoResult.error("已经存在");
    }

    @Override
    public EgoResult register(TbUser tbUser) {
        tbUser.setId(IDUtils.genItemId());
        Date date = new Date();
        tbUser.setCreated(date);
        tbUser.setUpdated(date);
        // 密码进行加密
        // 在公司中提供基础框架的项目经理或架构师一定会提供一个工具类，用作加密。
        // 在当前项目中直接使用Spring Framework 工具类
        String pwdMd = DigestUtils.md5DigestAsHex(tbUser.getPassword().getBytes());
        tbUser.setPassword(pwdMd);
        int index = tbUserDubboService.insert(tbUser);
        if(index==1){
            return EgoResult.ok();
        }
        return EgoResult.error("注册失败");
    }

    @Override
    public EgoResult login(TbUser tbUser) {
        // 需要对密码进行加密
        String pwdMd = DigestUtils.md5DigestAsHex(tbUser.getPassword().getBytes());
        tbUser.setPassword(pwdMd);
        TbUser user = tbUserDubboService.selectByUsernamePwd(tbUser);
        if(user!=null){
            // 一定要把user放在Egoresult中，控制器需要把用户信息放到作用域
            // 对购物车进行合并
            // 思路：1. 把cookie数据删除 2. 把临时购物车数据添加到用户购物车中。
            String cookieValue = CookieUtils.getCookieValueBase64(ServletUtil.getRequest(), tempCartCookeName);
            if(Strings.isNotEmpty(cookieValue)){
                Map<Long, CartPojo> tempCart = JsonUtils.jsonToMap(cookieValue, Long.class, CartPojo.class);
                // 把临时购物车数据放入到redis中。
                String key =cartRedisKey+user.getId();
                List<CartPojo> list = (List<CartPojo>) redisTemplate.opsForValue().get(key);
                for(Long id : tempCart.keySet()){
                    boolean isExists = false;
                    // 如果临时购物车中商品和用户购物车中商品重复，只修改数量
                    for(CartPojo cp : list){
                        if(cp.getId().equals(id)){
                            cp.setNum(cp.getNum()+tempCart.get(id).getNum());
                            isExists = true;
                            break;
                        }
                    }
                    if(!isExists){
                        list.add(tempCart.get(id));
                    }
                }
                // 合并成功
                redisTemplate.opsForValue().set(key,list);
                // 删除临时购物车
                CookieUtils.deleteCookie(ServletUtil.getRequest(),ServletUtil.getResponse(),tempCartCookeName);
            }
            return EgoResult.ok(user);
        }
        return EgoResult.error("用户名或密码不正确");
    }
}
